package Model.Application;

import Model.Application.Exception.CalculateApplicationException;
import Share.Constante.ConstanteChoixMessage;
import Share.Constante.ConstanteIdModeServer;
import Share.Protocole.Exception.ProtocoleException;
import Share.Protocole.InterfaceProtocole;

/**
 *  Classe Principale de l'Application Cliente
 *  @author Alex & Dogan
 */
public class ApplicationClient implements IModel {

    //Les constantes de message pour le Client
    private InterfaceProtocole protocole;

    /**
     *  Constructeur
     */
    public ApplicationClient(InterfaceProtocole p) {
        protocole = p;
    }

    /**
     *  Méthode pour lancer le Socket de connexion Server et le protocole Client
     */
    @Override
    public double calculate(int mode, double amount, double rate, Double arg) throws CalculateApplicationException {
        try {

            protocole.newMessage();
            protocole.addToMessage(ConstanteChoixMessage.ERREUR, null);
            protocole.addToMessage(ConstanteChoixMessage.MODE, mode);
            protocole.addToMessage(ConstanteChoixMessage.RATE, rate);
            protocole.addToMessage(ConstanteChoixMessage.AMOUNT, amount);
            protocole.addToMessage(ConstanteChoixMessage.ARGUMENT, arg);
            protocole.send();
            protocole.receive();
            Integer error = (Integer) protocole.getMessage(ConstanteChoixMessage.ERREUR);
            if (error != null) {
                throw new CalculateApplicationException(error);
            }
            if (mode != ConstanteIdModeServer.BYE) {
                return (Double) protocole.getMessage(ConstanteChoixMessage.ARGUMENT);
            }
            return -1;

        } catch (ProtocoleException pex) {
            throw new CalculateApplicationException(pex.getId());
        }
    }
}
